

package LogicaClasesNew;

import Logica.exceptions.NonexistentEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;


public class ControladorOrdenCompra implements IcontroladorOrdenCompra {

 //private EntityManagerFactory emf;
 
private IcontroladorCliente ICC;

private IcontroladorLineaOrden ICLORD;

//Nos trae el factory en su instancia actual, luego hace un get de persistencia y crea un entity y devuelve eso.
 public EntityManager getEntityManager() {
        Fabrica factory = Fabrica.getInstance(); 
        return factory.getEmf().createEntityManager();
    }

 
public void createOrdenCompra(int Numero, String FechaOrden, float precioTotal, String Nickname) {
        
        getInstanciaforICC();
    
        EntityManager em = null;
        
        
        Cliente cli = ICC.findCliente(Nickname);
        
        OrdenCompra  OC= new OrdenCompra(Numero,FechaOrden,precioTotal,cli);
        
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(OC);
            em.getTransaction().commit();
        } 
        catch (Exception t){
        //CAPTURA el error... y...
         StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
        };
            
         //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
            t.setStackTrace(trace);
            throw t;
            
        }
        finally {
            if (em != null) {
                em.close();
            }
        }
    }

//CONSTRUCTOR CON ID AUTOGENERADO
//SE IMPLEMENTO POR NECESIDAD QUE DEVUELVA EL INT NUMERO DE LA ORDEN COMPRA
public int createOrdenCompra2(String FechaOrden, float precioTotal, String Nickname, Estado estado){
        
        getInstanciaforICC();
    
        EntityManager em = null;
        
        Cliente cli = ICC.findCliente(Nickname);
        
        OrdenCompra  OC= new OrdenCompra(FechaOrden,precioTotal,cli,estado);
        
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(OC);
            em.getTransaction().commit();
        } 
        catch (Exception t){
        //CAPTURA el error... y...
         StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
        };
            
         //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
            t.setStackTrace(trace);
            throw t;
            
        }
        finally {
            if (em != null) {
                em.close();
            }
        }
     return OC.getNumero();
}

    private void editOrdenCompra(OrdenCompra orden){
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            orden = em.merge(orden);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int Numero = orden.getNumero();
                if (findOrdenCompra(Numero) == null) {
                   // throw new NonexistentEntityException("The producto with id " + Numero + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

     public void editOrdenCompra2(int numeroOrdenCompra, String FechaOrden, float precioTotal, String Nickname, Estado estado, String fechaOrdenC, String fechaordenP){
            
            OrdenCompra ordenModif = findOrdenCompra(numeroOrdenCompra);
            
            ordenModif.setPrecioTotal(precioTotal);
            
            ordenModif.setFechaOrdenC(fechaOrdenC);
            
            ordenModif.setFechaOrdenP(fechaordenP);
            
            ordenModif.setEstado(estado);
            
            editOrdenCompra(ordenModif);
    }
    
    public void destroy(int Numero) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            OrdenCompra ordCompra;
            try {
                ordCompra = em.getReference(OrdenCompra.class, Numero);
                ordCompra.getNumero();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The producto with id " + Numero + " no longer exists.", enfe);
            }
            em.remove(ordCompra);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }
    
    
    public OrdenCompra findOrdenCompra(int Numero) {
        EntityManager em = getEntityManager();
        try {
            return em.find(OrdenCompra.class, Numero);
        } finally {
            em.close();
        }
    }
    
    public List<OrdenCompra> findOrdenCompraEntities() {
        return findOrdenCompraEntities(true, -1, -1);
    }

    public List<OrdenCompra> findOrdenCompraEntities(int maxResults, int firstResult) {
        return findOrdenCompraEntities(false, maxResults, firstResult);
    }

    private List<OrdenCompra> findOrdenCompraEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(OrdenCompra.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }
       
    public int getOrdenCompratoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<OrdenCompra> rt = cq.from(OrdenCompra.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

    /*
    public List<OrdenCompra> getLineasOrdenComp(int Numero){
            return findOrdenCompra(Numero).getLineasOrden();
    }
*/
public void addLineaToOrdenCompra(int NumeroOrden, int LineaOrden){
        
        getInstanciaforICLORD();
        
        OrdenCompra OrdenBuscar = findOrdenCompra(NumeroOrden);
        
        LineaOrden lineaAgregar = ICLORD.findLineaOrden(LineaOrden);
        
        OrdenBuscar.addlineaorden(lineaAgregar);
        //PERSISTIMOS LA NUEVA ORDEN CON SU LINEA EN EL SISTEMA
        editOrdenCompra(OrdenBuscar);
    }

public void eliminarOrdenCompra(int numeroOrdenCompra){
        OrdenCompra OrdnEliminar = findOrdenCompra(numeroOrdenCompra);
        
        OrdnEliminar.setBajaLogica(true);
        
        editOrdenCompra(OrdnEliminar);
}
    
private IcontroladorCliente getInstanciaforICC(){
               Fabrica fab = Fabrica.getInstance();
               this.ICC = fab.getControladorCliente();
               return ICC;
           }
    
private IcontroladorLineaOrden getInstanciaforICLORD(){
               Fabrica fab = Fabrica.getInstance();
               this.ICLORD = fab.getControladorLineaOrden();
               return ICLORD;
           }


    public  List<LineaOrden> getListadoLineasXordenes(int numOrden){
        OrdenCompra ord = findOrdenCompra(numOrden);
        
        return ord.getLineasOrden();
    }

    public Estado retornarestado(int numeroOrdenCompra){
	        EntityManager em = getEntityManager();
	        try {
	            return em.find(OrdenCompra.class, numeroOrdenCompra).getEstado();
	        } finally {
	            em.close();
                }
			
	    }

}
